#ifndef C14_T3_WORKER_H_
#define C14_T3_WORKER_H_

#include<string>

class Worker
{
private:
	std::string _workerFullName;
	long _workerID;
protected:
	 void WorkerData() const;
	 void SetWorkerInfo();
public:
	Worker();
	Worker(const std::string & workerFullName, long workerID);
	virtual ~Worker() = 0;
	virtual void Set() = 0;
	virtual void Show() const = 0;
};

class Waiter : virtual public Worker
{
private:
	int _waiterPanache;
protected:
	void WorkerData() const;
	void SetWorkerInfo();
public:
	Waiter();
	Waiter(const std::string & workerFullName, long workerID, int waiterPanache = 0);
	Waiter(const Worker &worker, int waiterPanache = 0);
	~Waiter(){}
	void Set();
	void Show() const;
};

class Singer : virtual public Worker
{
protected:
	enum { SingerVoiceTypes = 7 };
	enum{other, alto, contralto, soprano, bass, bartitone, tenor};
	void WorkerData() const;
	void SetWorkerInfo();
private:
	static char *_pv[SingerVoiceTypes];
	int _singerVoice;
public:
	Singer();
	Singer(const std::string & workerFullName, long workerID, int singerVoice = other);
	Singer(const Worker & worker, int singerVoice = other);
	~Singer(){}
	void Set();
	void Show() const;
};

class SingingWaiter : public Singer, public Waiter
{
protected:
	void WorkerData() const;
	void SetWorkerInfo();
public:
	SingingWaiter();
	SingingWaiter(const std::string & workerFullName, long workerID, 
		int waiterPanache = 0, int singVoice = other);
	SingingWaiter(const Worker & worker, int waiterPanache = 0, int singVoice = other);
	SingingWaiter(const Waiter & waiter, int singVoice = other);
	SingingWaiter(const Singer & singer, int waiterPanache = 0);
	~SingingWaiter(){}
	void Set();
	void Show() const;
};


#endif